package manager.modulo.estoque.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.estoque.enumerator.EnumTipoInsumo;
import manager.modulo.estoque.enumerator.EnumTipoInsumo.TipoInsumo;
import manager.modulo.estoque.enumerator.EnumUnidadeInsumo;
import manager.modulo.estoque.enumerator.EnumUnidadeInsumo.UnidadeInsumo;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class InsumoDao implements InterfaceDao {

    private int id;
    private String identificador;
    private String nome;
    private UnidadeInsumo unidadeInsumo;
    private int estoqueMinimo;
    private int estoqueMaximo;
    private int valorUnitario;
    private int quantidade;
    private String localizacao;
    private String observacao;
    private TipoInsumo tipoInsumo;

    /**
     * Inicializando as variáveis
     */
    public InsumoDao() {
        identificador = "";
        nome = "";
        unidadeInsumo = UnidadeInsumo.NAOENCONTRADO;
        estoqueMinimo = 0;
        estoqueMaximo = 0;
        valorUnitario = 0;
        quantidade = 0;
        localizacao = "";
        observacao = "";
        tipoInsumo = TipoInsumo.NAOENCONTRADO;
    }

    public static int getIdInsumoPorIdentificador(String codigo) {
        try {

            String sql = "SELECT id FROM insumo WHERE tx_identificador = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, codigo);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Insumos");
            return 0;
        }
    }

    public static int getIdInsumoPorNome(String nome) {
        try {

            String sql = "SELECT id FROM insumo WHERE tx_nome = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, nome);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Insumos");
            return 0;
        }
    }

    public LinkedList<String> buscar(String opcao, String palavraBuscada, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Nome")) {// Buscando por Nome
                sql = "SELECT tx_nome FROM insumo WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Identificador")) {
                sql = "SELECT tx_identificador FROM insumo WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList buscarTabela(String opcao, String palavraBuscada) throws SQLException {
        LinkedList result = new LinkedList();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            if (opcao.equalsIgnoreCase("Nome")) { // Buscando por nome
                sql = "SELECT "
                        + " i.id as IdInsumo, "
                        + " i.tx_identificador as Identificador, "
                        + " i.tx_nome as Nome, "
                        + " i.cd_unidade as Unidade, "
                        + " i.nm_quantidade as Quantidade, "
                        + " i.nm_estoque_minimo as EstoqueMinimo, "
                        + " i.nm_valor_unitario as ValorUnitario, "
                        + " i.cd_tipo as TipoInsumo, "
                        + " i.tx_localizacao as Localizacao "
                        + "FROM "
                        + " insumo i "
                        + "WHERE "
                        + " i.tx_nome LIKE ? "
                        + "ORDER BY i.tx_nome ";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Identificador")) {
                sql = "SELECT "
                        + " i.id as IdInsumo, "
                        + " i.tx_identificador as Identificador, "
                        + " i.tx_nome as Nome, "
                        + " i.cd_unidade as Unidade, "
                        + " i.nm_quantidade as Quantidade, "
                        + " i.nm_estoque_minimo as EstoqueMinimo, "
                        + " i.nm_valor_unitario as ValorUnitario, "
                        + " i.cd_tipo as TipoInsumo, "
                        + " i.tx_localizacao as Localizacao "
                        + "FROM "
                        + " insumo i "
                        + "WHERE "
                        + " i.tx_identificador LIKE ? "
                        + "ORDER BY i.tx_identificador ";
                palavraBuscada += "%";
            }

            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> colunaIdentificador = new LinkedList<String>();
                LinkedList<String> colunaNome = new LinkedList<String>();
                LinkedList<String> colunaUnidade = new LinkedList<String>();
                LinkedList<String> colunaQuantidade = new LinkedList<String>();
                LinkedList<String> colunaEstoqueMinimo = new LinkedList<String>();
                LinkedList<String> colunaLocalizacao = new LinkedList<String>();
                LinkedList<String> colunaValorUnitario = new LinkedList<String>();
                LinkedList<Integer> colunaId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    colunaId.add(resultSet.getInt("IdInsumo"));
                    colunaIdentificador.add(resultSet.getString("Identificador"));
                    colunaNome.add(resultSet.getString("Nome"));
                    colunaUnidade.add(EnumUnidadeInsumo.ConvertEnumString(EnumUnidadeInsumo.ConverterNumeroEnum(resultSet.getInt("Unidade"))));
                    colunaQuantidade.add(Double.toString(((double) (resultSet.getInt("Quantidade"))) / 100));
                    colunaEstoqueMinimo.add(Integer.toString(resultSet.getInt("EstoqueMinimo")));
                    colunaValorUnitario.add(Format.formatarMonetario(Double.toString((resultSet.getDouble("ValorUnitario")) / 100)));
                    colunaLocalizacao.add(resultSet.getString("Localizacao"));
                }

                result.add(colunaId);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
                result.add(colunaIdentificador);
                result.add(colunaNome);
                result.add(colunaUnidade);
                result.add(colunaQuantidade);
                result.add(colunaEstoqueMinimo);
                result.add(colunaValorUnitario);
                result.add(colunaLocalizacao);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM insumo WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                identificador = resultSet.getString("tx_identificador");
                nome = resultSet.getString("tx_nome");
                estoqueMinimo = resultSet.getInt("nm_valor_unitario");
                unidadeInsumo = EnumUnidadeInsumo.ConverterNumeroEnum(resultSet.getInt("cd_unidade"));
                tipoInsumo = EnumTipoInsumo.ConverterNumeroEnum(resultSet.getInt("cd_tipo"));
                estoqueMinimo = resultSet.getInt("nm_estoque_minimo");
                estoqueMaximo = resultSet.getInt("nm_estoque_maximo");
                valorUnitario = resultSet.getInt("nm_valor_unitario");
                quantidade = resultSet.getInt("nm_quantidade");
                localizacao = resultSet.getString("tx_localizacao");
                observacao = resultSet.getString("tx_observacao");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Materiais");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {

        String sql = "INSERT INTO insumo "
                + "(tx_identificador,"
                + " tx_nome,"
                + " cd_unidade,"
                + " nm_estoque_minimo,"
                + " nm_estoque_maximo,"
                + " nm_valor_unitario,"
                + " nm_quantidade,"
                + " tx_localizacao,"
                + " cd_tipo,"
                + " tx_observacao) "
                + "VALUES ("
                + "?," // 01 Identificador
                + "?," // 02 Nome
                + "?," // 03 Unidade
                + "?," // 04 Estoque Minimo
                + "?," // 05 Estoque Maximo
                + "?," // 06 Valor Unitario
                + "?," // 07 Quantidade
                + "?," // 08 Localizacao
                + "?," // 09 Tipo Insumo
                + "?)"; // 10 Observacao
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, identificador);
        preparedStatement.setString(2, nome);
        preparedStatement.setInt(3, EnumUnidadeInsumo.ConverterEnumNumero(unidadeInsumo));
        preparedStatement.setInt(4, estoqueMinimo);
        preparedStatement.setInt(5, estoqueMaximo);
        preparedStatement.setInt(6, valorUnitario);
        preparedStatement.setInt(7, quantidade);
        preparedStatement.setString(8, localizacao);
        preparedStatement.setInt(9, EnumTipoInsumo.ConverterEnumNumero(tipoInsumo));
        preparedStatement.setString(10, observacao);

        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "  UPDATE insumo SET "
                + "     tx_identificador = ? ," // 01
                + "     tx_nome = ? ," // 02
                + "     cd_unidade = ? ," // 03
                + "     nm_estoque_minimo = ? ," // 04
                + "     nm_estoque_maximo = ? ," // 05
                + "     nm_valor_unitario = ? ," // 06
                + "     nm_quantidade = ? ," // 07
                + "     tx_localizacao = ?, " // 08
                + "     tx_observacao = ?, " // 09
                + "     cd_tipo = ? " // 10
                + " WHERE "
                + "     id = ?";             // 11
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, identificador);
        preparedStatement.setString(2, nome);
        preparedStatement.setInt(3, EnumUnidadeInsumo.ConverterEnumNumero(unidadeInsumo));
        preparedStatement.setInt(4, estoqueMinimo);
        preparedStatement.setInt(5, estoqueMaximo);
        preparedStatement.setInt(6, valorUnitario);
        preparedStatement.setInt(7, quantidade);
        preparedStatement.setString(8, localizacao);
        preparedStatement.setString(9, observacao);
        preparedStatement.setInt(10, EnumTipoInsumo.ConverterEnumNumero(tipoInsumo));
        preparedStatement.setInt(11, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getIdentificador() {
        return identificador;
    }

    public void setIdentificador(String identificador) {
        this.identificador = identificador;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public UnidadeInsumo getUnidadeInsumo() {
        return unidadeInsumo;
    }

    public void setUnidadeInsumo(UnidadeInsumo unidadeInsumo) {
        this.unidadeInsumo = unidadeInsumo;
    }

    public int getEstoqueMinimo() {
        return estoqueMinimo;
    }

    public void setEstoqueMinimo(int estoqueMinimo) {
        this.estoqueMinimo = estoqueMinimo;
    }

    public int getEstoqueMaximo() {
        return estoqueMaximo;
    }

    public void setEstoqueMaximo(int estoqueMaximo) {
        this.estoqueMaximo = estoqueMaximo;
    }

    public int getValorUnitario() {
        return valorUnitario;
    }

    public void setValorUnitario(int valorUnitario) {
        this.valorUnitario = valorUnitario;
    }

    public int getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }

    public String getLocalizacao() {
        return localizacao;
    }

    public void setLocalizacao(String localizacao) {
        this.localizacao = localizacao;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public TipoInsumo getTipoInsumo() {
        return tipoInsumo;
    }

    public void setTipoInsumo(TipoInsumo tipoInsumo) {
        this.tipoInsumo = tipoInsumo;
    }
}
